﻿/********************************************************************************
** @ Date:2025/04/08
** @ Author: Gaojia
** @ Description: 报警测点类，继承自 CMeasurePoint，扩展支持报警状态、级别、类型、区域及确认机制  报警判断放到线程里面
** @ Version:1.2.1
** @ Fun: 支持多级报警，报警确认功能，报警类型和区域设置
********************************************************************************/
#ifndef CALARMPOINT_H
#define CALARMPOINT_H

#include "CMeasurePoint.h"

// 报警等级枚举
enum  class EAlarmLevel {
	enNormal,     // 正常
	enLow,        // 低保报警
	enLowLow,     // 低低报警
	enHigh,       // 高报报警
	enHighHigh    // 高高报报警
};

// 报警确认状态枚举
enum class EAlarmConfirmStatus {
	enNormal=0,               // 正常
	enAlarmConfirmed,          // 报警产生已确认
	enAlarmClearPending,      // 报警消失未确认
	enAlarmPending           // 报警产生未确认
};

// 报警类型枚举
enum  EAlarmType {
	enProcess,    // 工艺报警
	enFault       // 故障报警
};

class CAlarmPoint : public CMeasurePoint
{
public:
	// 构造函数
	CAlarmPoint(const QString& sId, const QString& sName, QObject* parent = nullptr, EPointType type = EPointType::enAnalog,
		const QString& unit = "", double LLThreshold = 0.0, double LThreshold = 0.0,
		double HThreshold = 0.0, double HHThreshold = 0.0);

	// 重写基类方法：更新测点数据（具体实现由子类提供）
	void updateData() override;

	// 设置报警区域
	void setAlarmRegion(const QString& region);

	// 获取报警区域
	QString getAlarmRegion() const;

	// 设置报警类型
	void setAlarmType(EAlarmType type);

	// 获取报警类型
	EAlarmType getAlarmType() const;

	// 设置报警阈值
	void setThresholds(double LLThreshold, double LThreshold, double HThreshold, double HHThreshold);
	// 设置报警值  当测点值等于这个值的时候就报警
	void setAlarmValue(bool bValue);
	// 获取报警阈值
	void getThresholds(double &LLThreshold, double &LThreshold, double &HThreshold, double &HHThreshold) const;

	// 设置报警状态
	void setAlarmConfirmStatus(EAlarmConfirmStatus status);
	// 获取报警确状态
	EAlarmConfirmStatus getAlarmConfirmStatus();
	//设置报警状态
	void setAlarmStatus(bool bAlarm);

	// 设置报警确认
	void setAlarmConfirm();

	// 获取报警确认状态
	EAlarmConfirmStatus getAlarmConfirmStatus() const;

	// 获取报警等级
	EAlarmLevel getAlarmLevel() const;

	//获取报警时间
	QDateTime getAlarmTime()const;

	//设置报警状态是否发生变化
	void setAlarmStateChange(bool bState);
	//获取报警状态是否发生变化
	bool getAlarmStateChange()const;
	// 是否处于报警状态
	bool isAlarming() const;

	// 重写设置值的方法，带报警判断
	void setValue(const QVariant& value)override;

	// 设置测点的值，文件路径,并验证值的有效性
	void setValue(const QVariant& value, const QString& fileRef)override;
	//设置报警描述
	void setAlarmDesc(QString sDesc);
	QString getAlarmDesc()const;
	void showAlarmUi();   //显示报警界面
protected:
	// 内部方法：判断当前值是否触发报警
	virtual void checkAlarmCondition(const QVariant& value);

private:
	double m_dLLThreshold;     // 低低阈值
	double m_dLThreshold;      // 低阈值
	double m_dHThreshold;      // 高阈值
	double m_dHHThreshold;     // 高高阈值
	bool m_bAlarmValue;        // 报警值 当测点值等于这个值的时候报警 
	EAlarmLevel m_eAlarmLevel; // 报警等级
	EAlarmConfirmStatus m_eConfirmStatus;  // 报警状态
	bool m_bAlarming;          // 当前是否处于报警状态
	bool m_bAlarmChange;       //报警状态是否变化  更新数据库用
	EAlarmType m_eAlarmType;   // 报警类型
	QString m_sAlarmRegion;    // 报警区域（例如 "A001" 到 "A256"）
	QDateTime m_alarmTime;     // 报警产生时间
	QString m_sAlarmDesc;      //报警描述 
};

#endif // CALARMPOINT_H
